﻿using System.Data;
using System.Data.SqlClient;
using KZ.Exception;
using KZ.Utilities;
using Process.Entities;

namespace Process.DAL
{
    public class OrderDAL
    {
        private static OrderENT CreateOrderFromReader(IDataReader reader)
        {
            OrderENT item = new OrderENT();

            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.OrderID.ToString()))) item.OrderID = Utility.StringParse(reader[OrderColumns.OrderID.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.OrderDate.ToString()))) item.OrderDate = Utility.DateTimeParse(reader[OrderColumns.OrderDate.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.TransID.ToString()))) item.TransID = Utility.StringParse(reader[OrderColumns.TransID.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.Quantity.ToString()))) item.Quantity = Utility.IntParse(reader[OrderColumns.Quantity.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.UnitPrice.ToString()))) item.UnitPrice = Utility.DecimalParse(reader[OrderColumns.UnitPrice.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.TransportPrice.ToString()))) item.TransportPrice = Utility.DecimalParse(reader[OrderColumns.TransportPrice.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.GrandTotal.ToString()))) item.GrandTotal = Utility.DecimalParse(reader[OrderColumns.GrandTotal.ToString()]);
            if (!reader.IsDBNull(reader.GetOrdinal(OrderColumns.OrderStatus.ToString()))) item.OrderStatus = Utility.StringParse(reader[OrderColumns.OrderStatus.ToString()]);

            return item;
        }

        public bool InsertOrder(OrderENT order)
        {
            try
            {
                DataAccessHelper.AddParameter("OrderID", SqlDbType.VarChar, order.OrderID);
                DataAccessHelper.AddParameter("OrderDate", SqlDbType.DateTime, order.OrderDate);
                DataAccessHelper.AddParameter("TransID", SqlDbType.VarChar, order.TransID);
                DataAccessHelper.AddParameter("Quantity", SqlDbType.Int, order.Quantity);
                DataAccessHelper.AddParameter("UnitPrice", SqlDbType.Decimal, order.UnitPrice);
                DataAccessHelper.AddParameter("TransportPrice", SqlDbType.Decimal, order.TransportPrice);
                DataAccessHelper.AddParameter("GrandTotal", SqlDbType.Decimal, order.GrandTotal);
                DataAccessHelper.AddParameter("OrderStatus", SqlDbType.VarChar, order.OrderStatus);

                if (DataAccessHelper.ExecuteNonQuery("procOrderInsert") > 0)
                {
                    return true;
                }
                throw new DataAccessException("Có lỗi trong quá trình thêm mới giao dịch cập nhật kho.");
            }
            catch (SqlException)
            {
                throw new DataAccessException("Có lỗi trong quá trình thêm mới giao dịch cập nhật kho.");
            }
            finally
            {
                DataAccessHelper.ClearCommand();
            }
        }

        public bool UpdateOrderStatus(string transID, OrderStatus status)
        {
            try
            {
                DataAccessHelper.AddParameter("TransID", SqlDbType.VarChar, transID);
                DataAccessHelper.AddParameter("OrderStatus", SqlDbType.VarChar, status);

                if (DataAccessHelper.ExecuteNonQuery("procOrderUpdateStatus") > 0)
                {
                    return true;
                }
                throw new DataAccessException("Có lỗi trong quá trình cập nhật đơn hàng.");
            }
            catch (SqlException)
            {
                throw new DataAccessException("Có lỗi trong quá trình cập nhật đơn hàng.");
            }
            finally
            {
                DataAccessHelper.ClearCommand();
            }
        }
    }
}
